home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Demo / www / www4inet.py < prev    next >
Text File  |  1996-03-12  |  3KB  |  111 lines

  1. #! /usr/local/bin/python
  2.  
  3. # WWW server invoked by inetd.
  4. # Stdin and stdout are connected to a TCP/IP socket.
  5. # Serves one request.
  6.  
  7.  
  8. # Configuration section
  9. #
  10. DIR = '/ufs/guido/src/www/www-data/'
  11. HOME = '/ufs/guido/src/www'
  12. LOG = HOME + '/Log-inet'
  13.  
  14.  
  15. # Imported modules
  16. #
  17. import sys
  18. sys.path.insert(0, HOME)
  19. import time
  20. import os
  21. import socket
  22. import string
  23. import calendar
  24. import wwwlib
  25.  
  26.  
  27. # Main program
  28. #
  29. def main():
  30.     try:
  31.         fd = sys.stdin.fileno()
  32.         s = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
  33.         host, port = s.getpeername()
  34.     except:
  35.         host = '???'
  36.     serve(sys.stdin, sys.stdout, host)
  37.  
  38.  
  39. # Server routine
  40. #
  41. def serve(input, output, client):
  42.     request = input.readline()
  43.     if request[-1:] == '\n': request = request[:-1]
  44.     if request[-1:] == '\r': request = request[:-1]
  45.     words = string.split(request)
  46.     if len(words) < 2 or string.lower(words[0]) <> 'get':
  47.         log('bad request from', client, `request`[:40])
  48.         return
  49.     addr = words[1]
  50.     scheme, host, port, path, search, anchor = wwwlib.parse_addr(addr)
  51.     if scheme and scheme <> 'http':
  52.         log('request bad scheme from', client, 'in', `addr`)
  53.         output.write('Bad scheme in requested address\n')
  54.         return
  55.     if host and host <> thishost:
  56.         log('request bad host from', client, 'in', `addr`)
  57.         output.write('Non-local host in requested address\n')
  58.         return
  59.     if port and port <> `thisport`:
  60.         log('request bad port from', client, 'in', `addr`)
  61.         output.write('Unexpected host in requested address\n')
  62.         return
  63.     if search:
  64.         log('request with search key from', client, 'in', `addr`)
  65.         output.write('Search key not supported by this server\n')
  66.         return
  67.     while path[:1] == '/': path = path[1:]
  68.     path = os.path.normpath(path)
  69.     if path[:1] == '.':
  70.         log('request illegal path from', client, 'in', `addr`)
  71.         output.write('Illegal path in requested address\n')
  72.         return
  73.     path = DIR + path
  74.     if not os.path.isfile(path):
  75.         log('request non-file path from', client, 'in', `addr`)
  76.         output.write('Invalid path in requested address\n')
  77.         return
  78.     try:
  79.         f = open(path, 'r')
  80.     except IOError, msg:
  81.         log('IOError', str(msg), 'opening', path, 'for', client)
  82.         output.write('Access violation in requested address\n')
  83.         return
  84.     log('sending', path[len(DIR):], 'to', client)
  85. ##    if path[-5:] != '.html':
  86. ##        log('sending <PLAINTEXT> prefix to', client)
  87. ##        output.write('<PLAINTEXT>\n')
  88.     try:
  89.         while 1:
  90.             buf = f.read(8192)
  91.             if not buf: break
  92.             output.write(buf)
  93.     except IOError, msg:
  94.         log('IOError', msg, 'reading', path, 'for', client)
  95.  
  96.  
  97. # Write a log message
  98. #
  99. def log(*args):
  100.     now = time.time()
  101.     broken_up_time = time.localtime(now)
  102.     s = calendar.asctime(broken_up_time)[4:]
  103.     for arg in args: s = s + (' ' + arg)
  104.     s = s + '\n'
  105.     f = open(LOG, 'a')
  106.     f.write(s)
  107.     f.close()
  108.  
  109.  
  110. main()
  111.